#ifndef __M_ONLINE_H__
#define __M_ONLINE_H__
#include "util.hpp"
#include "logerr.hpp"

class online
{
private:
    // 在线分为两者 一种是在大厅 一种在游戏房间内
    std::unordered_map<uint32_t, webserve_t::connection_ptr> _hall_user;
    std::unordered_map<uint32_t, webserve_t::connection_ptr> _room_user;
    std::mutex _mutex;

public:
    // 进入大厅 进入房间接口 在websocket连接建立时
    void enter_game_hall(uint64_t uid, webserve_t::connection_ptr &conn)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.insert(std::make_pair(uid, conn));
    }
    void enter_game_room(uint64_t uid, webserve_t::connection_ptr &conn)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.insert(std::make_pair(uid, conn));
    }

    // 离开游戏大厅 和游戏房间 在websocket连接断开时
    void exit_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        //DBG_LOG("uid=%s离开游戏大厅", std::to_string(uid).c_str());
        _hall_user.erase(uid);
         
    }
    void exit_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        DBG_LOG("uid=%s离开房间大厅", std::to_string(uid).c_str());
      
        _room_user.erase(uid);
       
    }

    // 查询是否在游戏大厅中 或者是否在游戏房间中
    bool is_in_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if (it == _hall_user.end())
        {
            return false;
        }
        return true;
    }
    bool is_in_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if (it == _room_user.end())
        {
            return false;
        }
        return true;
    }
    void show_hall()
    {
       std::unique_lock<std::mutex> lock(_mutex);
        DBG_LOG("hall_online_num=%d",(int)_hall_user.size());
        for (auto &ch : _hall_user)
        {
            DBG_LOG("hall-- uid=%s",std::to_string(ch.first).c_str());
        }
    }
    void show_room()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        for (auto &ch : _room_user)
        {
             DBG_LOG("room-- uid=%s",std::to_string(ch.first).c_str());
        }
    }
    // 如果在线我们可以通过id 获取连接
    webserve_t::connection_ptr get_conn_from_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if (it == _hall_user.end())
        {
            return webserve_t::connection_ptr(); // 就是一个void 指针默认为空指针
        }
        return it->second;
    }
    webserve_t::connection_ptr get_conn_from_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if (it == _room_user.end())
        {
            return webserve_t::connection_ptr();
        }
        return it->second;
    }
};
#endif